import java.io.*;
import java.util.Scanner;

/**
 * 尝试⽤Java基础的内容编写⼀个⽂件复制器, ⽀持让⽤⼾输⼊⽬标⽂件的路径和要复制的⽬标路径
 * 实现将⽬标⽂件复制到⽬标路径下的功能
 * ◦ 思考如何限制⽤⼾不做出错误的⾏为
 * ◦ ⽤⼾⾏为有误程序如何引导⽤⼾做出正确的⾏为
 * @author 邱彦祥
 *
 * 可改善问题
 * 若用户输入的源路径为文件目录，目标路径为文件路径，会出错！
 * 多次使用复制器，需要多次启动问题
 *
 */

public class FileReplicator {

    /**
     * target 数量标志
     * sc 获取用户输入
     */
    static int target = 0;
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        System.out.println("请输入例如C:/website/web/index.html形式的路径");
        //接收源文件路经
        System.out.println("请输入源文件(夹)路径:");
        String dirPath = sc.nextLine();
        //逻辑处理判断，你输入的路径是否存在，也即目录是否存在，不存在则重新输入
        while(true){
            if(!(new File(dirPath)).exists()){
                System.out.println("文件(夹)的路径不存在,请重新输入源路径名:");
                dirPath = sc.nextLine();
            }else {
                break;
            }
        }
        //接收文件复制路径
        System.out.println("请输入目标路径:");
        String destPath = sc.nextLine();
        //新建源文件和复制文件对像
        File dirFile = new File(dirPath);
        File destFile = new File(destPath);
        //判断输入的是文件夹还是文件
        if(dirFile.isFile()){
            fileCopy(dirFile,destFile);
        }else if(dirFile.isDirectory()){
            fileFolderCopy(dirPath,destPath);
        }
    }

    /**
     * 文件复制
     * @param dirFile   源文件对象
     * @param destFile  目标文件对象
     */
    public static void fileCopy(File dirFile, File destFile){
        //记录耗时
        long start = 0;
        long end = 0;
        //处理异常
        try(
                //新建字节输入输出流管道
                FileInputStream fileInputStream = new FileInputStream(dirFile);
                FileOutputStream fileOutputStream = new FileOutputStream(destFile)
        ){
            //新建存储字节数组
            byte[] tempSpace = new byte[1024];
            int byteLen = 1024;
            //记录读到的字节数
            int len;
            //开始复制
            start = System.currentTimeMillis();
            while((len = fileInputStream.read(tempSpace,0,byteLen)) > 0) {
                fileOutputStream.write(tempSpace, 0, len);
            }
            end = System.currentTimeMillis();
            target = 1;
        } catch (IOException e) {
            e.printStackTrace();
        }
        //反馈结果
        if(target == 1){
            System.out.println("本次复制过程总共花费了:"+(end-start)+"ms!");
            System.out.println("复制完成！");
        }else {
            System.out.println("复制出错！");
        }
    }

    /**
     * 文件目录复制
     * @param dirPath   源路径
     * @param desPath   目标路径
     */
    public static void fileFolderCopy(String dirPath, String desPath){
        //记录耗时
        long start = System.currentTimeMillis();
        //创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
        boolean mkdirs = new File(desPath).mkdirs();
        if(!mkdirs){
            System.out.println("复制失败！");
            return;
        }
        File dirFile = new File(dirPath);
        //拿到源路径的文件列表
        String[] files = dirFile.list();
        File temp;
        if (files != null) {
            for (String file : files) {
                if (dirPath.endsWith(File.separator)) {
                    temp = new File(dirPath + file);
                } else {
                    temp = new File(dirPath + File.separator + file);
                }
                //如果是文件,就执行拷贝动作,否则就先建立相应的文件夹之后在进行相应的动作
                if (temp.isFile()) {
                    FileInputStream fileInputStream = null;
                    FileOutputStream fileOutputStream = null;
                    try {
                        //创建一个输入流，去读源文件中的内容
                        fileInputStream = new FileInputStream(temp);
                        //创建一个输出流，将内容写进新文件中 注意"\"也可以
                        fileOutputStream = new FileOutputStream(desPath + "\\" + temp.getName());
                        //临时存储字节数组
                        byte[] tempSpace = new byte[1024];
                        int byteLen = 1024;
                        int len;
                        //每次读入tempSpace大小的空间
                        while ((len = fileInputStream.read(tempSpace, 0, byteLen)) > 0) {
                            fileOutputStream.write(tempSpace, 0, len);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (fileOutputStream != null) {
                            try {
                                fileOutputStream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if (fileInputStream != null) {
                            try {
                                fileInputStream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } else {
                    target++;
                    fileFolderCopy(dirPath + "\\" + file, desPath + "\\" + file);
                }
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("你要复制的文件夹下面的目录以及子目录中的目录共有:"+target+"个");
        System.out.println("本次复制过程总共花费了:"+(end-start)+"ms!");
    }
}



